package com.uade.empresasdistribuidas.dao;

import java.util.List;

import org.hibernate.Query;

import com.uade.empresasdistribuidas.entities.EnvioDTO;
import com.uade.empresasdistribuidas.entities.EnvioLocalDTO;
import com.uade.empresasdistribuidas.entities.RecorridoDTO;
import com.uade.empresasdistribuidas.model.EnvioLocal;

public class EnvioLocalDAOImpl  extends GenericHibernateDAO<EnvioLocalDTO, Long> implements EnvioLocalDAO{

	public List<EnvioLocalDTO> obtenerEnviosEnEsperaMismoTrayectoMismosObjetos(Integer idRecorrido,boolean refrigerado){
		Query query=null;
		if (refrigerado){
			query=getSession().createQuery("Select envio from  EnvioLocalDTO "
					+ "envio join envio.recorrido recorrido join envio.vehiculo vehiculo "
					+ "where recorrido.codigoRecorrido=:idRecorrido and vehiculo.refrigerado=:refrigerado and envio.estado=:estado").setLong("idRecorrido", idRecorrido).
					setBoolean("refrigerado", refrigerado).setString("estado", EnvioLocal.EN_DEPOSITO);
		}else{
			query=getSession().createQuery("Select envio from  EnvioLocalDTO "
					+ "envio join envio.recorrido recorrido join envio.vehiculo vehiculo "
					+ "where recorrido.codigoRecorrido=:idRecorrido and envio.estado=:estado").setLong("idRecorrido", idRecorrido).
					setString("estado", EnvioLocal.EN_DEPOSITO);
		}
		List<EnvioLocalDTO> envios=query.list();
		return envios;
		
	}

	@Override
	public EnvioLocalDTO obtenerEnvioEnEspera(Integer nroVehiculo,
			String sucursal) {
		Query query=getSession().createQuery("Select envio from  EnvioLocalDTO "
				+ "envio join envio.recorrido recorrido join envio.vehiculo vehiculo "
				+ "where recorrido.sucursalOrigen.nombre=:sucursal and vehiculo.codigoVehiculo=:nroVehiculo and envio.estado=:estado").
				setString("sucursal", sucursal).setInteger("nroVehiculo", nroVehiculo).setString("estado", EnvioLocal.EN_DEPOSITO);
		EnvioLocalDTO envio=(EnvioLocalDTO)query.uniqueResult();
		return envio;
	}

	@Override
	public EnvioLocalDTO obtenerEnvioEnTrayecto(Integer nroVehiculo,
			String sucursal) {
		Query query=getSession().createQuery("Select envio from  EnvioLocalDTO "
				+ "envio join envio.recorrido recorrido join envio.vehiculo vehiculo "
				+ "where recorrido.sucursalDestino.nombre=:sucursal and vehiculo.codigoVehiculo=:nroVehiculo and envio.estado=:estado").
				setString("sucursal", sucursal).setInteger("nroVehiculo", nroVehiculo).setString("estado", EnvioLocal.EN_TRAYECTO);
		EnvioLocalDTO envio=(EnvioLocalDTO)query.uniqueResult();
		return envio;
	}


}
